////////////////////////////////////////////////////////////////////////
//
//     Copyright (c) 2009-2013 Denim Group, Ltd.
//
//     The contents of this file are subject to the Mozilla Public License
//     Version 2.0 (the "License"); you may not use this file except in
//     compliance with the License. You may obtain a copy of the License at
//     http://www.mozilla.org/MPL/
//
//     Software distributed under the License is distributed on an "AS IS"
//     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//     License for the specific language governing rights and limitations
//     under the License.
//
//     The Original Code is ThreadFix.
//
//     The Initial Developer of the Original Code is Denim Group, Ltd.
//     Portions created by Denim Group, Ltd. are Copyright (C)
//     Denim Group, Ltd. All Rights Reserved.
//
//     Contributor(s): Denim Group, Ltd.
//
////////////////////////////////////////////////////////////////////////
package com.denimgroup.threadfix.data.dao;

import java.util.List;

import com.denimgroup.threadfix.data.entities.Application;
import com.denimgroup.threadfix.data.entities.Finding;
import com.denimgroup.threadfix.data.entities.Vulnerability;

/**
 * Basic DAO class for the Vulnerability entity.
 * 
 * @author mcollins
 * @author dwolf
 */
public interface VulnerabilityDao {

	/**
	 * @param vulnerabilityId
	 */
	void delete(Vulnerability vulnerability);

	/**
	 * @return
	 */
	List<Vulnerability> retrieveAll();

	/**
	 * @return
	 */
	List<Vulnerability> retrieveAllActive();

	/**
	 * @param applicationId
	 * @return
	 */
	List<Vulnerability> retrieveAllActiveByApplication(int applicationId);

	/**
	 * @param vulnerability
	 * @return
	 */
	List<Vulnerability> retrieveAllByGenericVulnerabilityAndApp(Vulnerability vulnerability);

	/**
	 * @return
	 */
	List<Vulnerability> retrieveAllInactive();

	/**
	 * 
	 * @param applicationIdList
	 * @return
	 */
	List<Vulnerability> retrieveByApplicationIdList(List<Integer> applicationIdList);

	/**
	 * @param hash
	 * @param applicationId
	 * @return
	 */
	Vulnerability retrieveByHashAndApp(String hash, int applicationId);

	/**
	 * @param id
	 * @return
	 */
	Vulnerability retrieveById(int id);

	/**
	 * @param hash
	 * @param applicationId
	 * @return
	 */
	List<Vulnerability> retrieveByLocationHashAndApp(String hash, int applicationId);

	/**
	 * @param hash
	 * @param applicationId
	 * @return
	 */
	List<Vulnerability> retrieveByVariableHashAndApp(String hash, int applicationId);
	
	/**
	 * @param vulnerability
	 * @return
	 */
	List<Vulnerability> retrieveSimilarHashes(Vulnerability vulnerability);
	
	/**
	 * @param vulnerability
	 */
	void saveOrUpdate(Vulnerability vulnerability);

	/**
	 * 
	 * This is a ridiculous number of parameters. 
	 * This method is complicated enough though and I didn't want to add bean parsing to it.
	 * 
	 * @param appId
	 * @param page
	 * @param field 
	 * @param sort 
	 * @param param 
	 * @param path 
	 * @param severity 
	 * @param description 
	 * @return
	 */
	List<Vulnerability> retrieveActiveByAppIdAndPage(int appId, int page, int sort, int field, Integer cwe,
								String description, String severity, String path, String param,
								boolean open, boolean falsePositive);

	/**
	 * 
	 * @param appId
	 * @param description
	 * @param severity
	 * @param path
	 * @param param
	 * @param cweInteger 
	 * @return
	 */
	long getVulnCountWithFilters(Integer appId, String description,
			String severity, String path, String param, Integer cweInteger, 
			boolean open, boolean falsePositive);

	/**
	 * 
	 * @param application
	 * @param value
	 * @return
	 */
	List<Vulnerability> getFalsePositiveVulnCount(Application application,
			boolean value);

	/**
	 * 
	 * @param appId
	 * @return
	 */
	long getVulnCount(Integer appId, boolean open);
	
	/**
	 * 
	 * @param finding
	 */
	void evict(Finding finding);
}
